From 3a728abec02ac4b673114d55732b822e8a5c30b2 Mon Sep 17 00:00:00 2001 From: Joan Torres Lopez Date: Fri, 20 Feb 2026 12:39:39 +0100 Subject: [PATCH] environment: Extract transition completion handling into helper function Add _setupTransitionCompletion to centralize started/stopped signal handling and cleanup logic. Both _easeActor and _easeAnimatableProperty now use this helper, reducing code duplication and ensuring consistent behavior. The signal holder is created as a child of sessionSignalHolder for proper cleanup on session shutdown. Part-of: (cherry picked from commit 3b638993b7456565ec6f60ceb20df39302313d39) --- js/ui/environment.js | 43 ++++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/js/ui/environment.js b/js/ui/environment.js index 0e0ab2f33..e94831fe9 100644 --- a/js/ui/environment.js +++ b/js/ui/environment.js @@ -81,6 +81,25 @@ function _makeEaseCallback(params, cleanup) { return {promise, callback}; } +function _setupTransitionCompletion(transition, callback, prepare) { + const signalHolder = new SignalTracker.TransientSignalHolder(sessionSignalHolder); + + const complete = finished => { + signalHolder.destroy(); + callback(finished); + }; + + if (prepare) { + if (transition.delay) + transition.connectObject('started', () => prepare(), signalHolder); + else + prepare(); + } + + transition.connectObject('stopped', (_, finished) => + complete(finished), signalHolder); +} + function _makeEasePrepareAndCleanup(duration) { if (!duration) return {prepare: null, cleanup: null}; @@ -178,19 +197,10 @@ function _easeActor(actor, params) { const [transition] = transitions; - if (prepare) { - if (transition?.delay) - transition.connectObject('started', () => prepare(), sessionSignalHolder); - else - prepare(); - } - if (transition) { - transition.connectObject('stopped', (t, finished) => { - transition.disconnectObject(sessionSignalHolder); - callback(finished); - }, sessionSignalHolder); + _setupTransitionCompletion(transition, callback, prepare); } else { + prepare?.(); callback(true); } @@ -270,17 +280,8 @@ function _easeAnimatableProperty(animatable, propName, target, params) { transition.set_to(target); - if (prepare) { - if (transition.delay) - transition.connectObject('started', () => prepare(), sessionSignalHolder); - else - prepare(); - } + _setupTransitionCompletion(transition, callback, prepare); - transition.connectObject('stopped', (t, finished) => { - transition.disconnectObject(sessionSignalHolder); - callback(finished); - }, sessionSignalHolder); return promise; } -- 2.39.5